package edu.utn.tacs.grupouno.dao.implementations;

import java.util.Iterator;
import java.util.List;
import java.util.UUID;

import org.hibernate.Query;

import edu.utn.tacs.grupouno.dao.AnalisisDAO;
import edu.utn.tacs.grupouno.negocio.Analisis;
import edu.utn.tacs.grupouno.negocio.Estudio;

public class AnalisisDAOHibernate extends AbstractHibernateDAO implements AnalisisDAO {
	
	@Override
	public List<Analisis> getAnalisis() {
		Query query = getSession().createQuery("from Analisis");
		return query.list();
	}

	@Override
	public Analisis getAnalisis(String id) {
		Query query = getSession().createQuery("from Analisis a where a.id = ?");
		query.setParameter(0, UUID.fromString(id));
		List<Analisis> list = query.list();
		return list.isEmpty() ? null : list.get(0);
	}

	@Override
	public void saveAnalisis(Analisis analisis) {
		getSession().saveOrUpdate(analisis);
		getSession().flush();
	}

	@Override
	public void deleteAnalisis(String id) {
		Analisis analisis = getAnalisis(id);
		if(analisis != null) {
			getSession().delete(analisis);
		}
	}

	@Override
	public List<Estudio> getEstudios(String id) {
		Analisis analisis = (Analisis) getSession().get(Analisis.class, UUID.fromString(id));
		return analisis == null ? null : analisis.getEstudios();
	}

	@Override
	public void addEstudio(String id, Estudio estudio) {
		Analisis analisis = getAnalisis(id);
		analisis.addEstudio(estudio);
		getSession().saveOrUpdate(analisis);
	}

	@Override
	public void deleteEstudio(String idAnalisis, String idEstudio) {
		Analisis analisis = getAnalisis(idAnalisis);
		Iterator<Estudio> iterator = analisis.getEstudios().iterator();
		while(iterator.hasNext()) {
			Estudio estudio = iterator.next();
			if(estudio.getId().equals(UUID.fromString(idEstudio))) {
				iterator.remove();
			}
		}
		getSession().saveOrUpdate(analisis);
	}

	@Override
	public void deleteEstudios(String id) {
		Analisis analisis = getAnalisis(id);
		analisis.getEstudios().clear();
		getSession().saveOrUpdate(analisis);
	}

}
